// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.logic.qrcode;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.eva.android.ToolKits;
import com.eva.android.widget.ActivityRoot;
import com.eva.android.widget.ChoiceItemPopWindow;
import com.eva.android.widget.WidgetUtils;
import com.eva.android.widget.alert.AlertDialog;
import com.eva.epc.common.util.CommonUtils;
import com.king.zxing.CameraScan;
import com.king.zxing.util.CodeUtils;
import com.x52im.rbchat.MyApplication;
import com.x52im.rbchat.R;
import com.x52im.rbchat.cache.ImageCacheLoader;
import com.x52im.rainbowchat.http.logic.dto.GroupEntity;
import com.x52im.rainbowchat.http.logic.dto.RosterElementEntity;
import com.x52im.rbchat.logic.qrcode.utils.QRCodeScheme;
import com.x52im.rbchat.utils.ActivityRequestCode;
import com.x52im.rbchat.utils.IntentFactory;

import java.util.ArrayList;

/**
 * "我的二维码"和"群二维码"界面。
 *
 * @author JackJiang
 * @since 8.0
 */
public class QRCodeGenerateActivity extends ActivityRoot {

    private final static String TAG = QRCodeGenerateActivity.class.getSimpleName();

    /** 2维码及其辅助内容的父layout，当前主要用于将2维码保存到系统相册时（保存的就是这个layout view对象内容） */
    private ViewGroup layoutContent = null;

    /** 标签：头像 */
    private ImageView viewAvatar = null;
    /** 标签：昵称 */
    private TextView nameTextView;
    /** 标签：描述 */
    private TextView descView;

    /** 标签：性别 */
    private ImageView sexView;

    /** 图片：2维码中间的logo图 */
    private ImageView viewAvatarLogo = null;
    /** 图片：2维码图 */
    private ImageView viewQrcode = null;

    /** 标签：2维码下方面的描述文字 */
    private TextView viewQrBottomDesc = null;
    /** 布局：2维码上的logo父布局 */
    private View layoutQrLogo = null;

    /** 标题栏上的"更多"按钮 */
    private Button btnMore = null;
    /** 标题栏上的"更多"按钮对应的弹出菜单 */
    private MorePopWindow menuWindow = null;

    private String schemeFromIntent = null;
    private String idFromIntent = null;

    /**
     * 解析从Intent中传过来的可能的数据本方法中实现.
     * 例如从上一个activity中传过来的数据，本方法被 {@link #init(Bundle)}调用。
     */
    @Override
    protected void initDataFromIntent() {
        // 解析从intent中传过来的数据
        ArrayList<String> intentDatas = IntentFactory.parseQRCodeGenerateIntent(getIntent());
        schemeFromIntent = intentDatas.get(0);
        idFromIntent = intentDatas.get(1);
    }

    /**
     * 本方法由父类的onCreate()调用，子类可在此方法中实现自已的UI显示逻辑。
     */
    @Override
    protected void initViews(Bundle savedInstanceState) {
        // 设定自定义标题栏（设定此值即意味着开启自定义标题栏的使用，必须要在setContentView前设定）
        customeTitleBarResId = R.id.qrcode_generate_activity_titleBar;
        // 养成良好习惯：首先设置主layout，确保后绪的操作中使用到的组件都可以被find到
        setContentView(R.layout.qrcode_generate_activity);

        // 标题栏按钮
        btnMore = this.getCustomeTitleBar().getRightGeneralButton(R.drawable.common_title_btn_more);

        // 初始化各种组件
        layoutContent = findViewById(R.id.qrcode_generate_activity_contentLayout);
        nameTextView =  findViewById(R.id.qrcode_generate_activity_nickNameView);
        sexView =  findViewById(R.id.qrcode_generate_activity_sexView);
        descView = findViewById(R.id.qrcode_generate_activity_descView);
        viewAvatar = findViewById(R.id.qrcode_generate_activity_adavarIv);
        viewAvatarLogo = findViewById(R.id.qrcode_generate_activity_avartarLogoIv);
        viewQrcode = findViewById(R.id.qrcode_generate_activity_qrIv);
        viewQrBottomDesc = findViewById(R.id.qrcode_generate_activity_qrBottomDescTv);
        layoutQrLogo = findViewById(R.id.qrcode_generate_activity_qrLogoLayout);

        // 刷新界面数据显示
        refreshDatas();
        // 显示头像
        loadAvatar();
    }

    /**
     * 本方法由父类的onCreate()调用，子类可在此方法中为各UI功能组件增加事件临听。
     */
    @Override
    protected void initListeners() {
        btnMore.setOnClickListener(v -> showMenuWindow());
    }

    /**
     * 刷新界面数据的显示。
     */
    private void refreshDatas() {

        nameTextView.setText("");
        descView.setText("");
        sexView.setVisibility(View.GONE);
        layoutQrLogo.setVisibility(View.VISIBLE);

        // 当前生成的是"我的2维码"
        if (QRCodeScheme.isAddUserQRCode(schemeFromIntent)) {
            // 本地用户信息
            RosterElementEntity localUserInfo = lu();
            if (localUserInfo != null) {
                nameTextView.setText(localUserInfo.getNickname());
                descView.setText(ToolKits.i18n(self(), R.string.qrcode_generate_activity_user_id, localUserInfo.getUser_uid()));

                // 设置性别图标
                int resId = localUserInfo.isMan() ? R.drawable.sns_friend_list_form_item_male_img : R.drawable.sns_friend_list_form_item_female_img;
                sexView.setVisibility(View.VISIBLE);
                sexView.setImageResource(resId);
            }

            setTitle($$(R.string.qrcode_generate_activity_title1));
            viewQrBottomDesc.setText($$(R.string.qrcode_generate_activity_generate_hint1));
        }
        // 当前生成的是"群聊2维码"
        else if(QRCodeScheme.isJoinGroupQRCode(schemeFromIntent)){
            // 取出群信息
            GroupEntity ge = MyApplication.getInstance2().getIMClientManager().getGroupsProvider().getGroupInfoByGid(idFromIntent);
            if(ge != null){
                nameTextView.setText(ge.getG_name());
                descView.setText(ToolKits.i18n(self(), R.string.qrcode_generate_activity_group_create_since, ge.getCreate_time()));
            }

            layoutQrLogo.setVisibility(View.GONE);
            setTitle($$(R.string.qrcode_generate_activity_title2));
            viewQrBottomDesc.setText($$(R.string.qrcode_generate_activity_generate_hint2));
        }
        else{
            new AlertDialog.Builder(this)
                    .setTitle(this.getResources().getString(R.string.general_error))
                    .setMessage("无效的schemeFromIntent="+schemeFromIntent)
                    .setPositiveButton(this.getResources().getString(R.string.general_ok), (dialog, which) -> self().finish())
                    .show();
            return;
        }

        // 显示2维码图片
        try {
            // 组织2维码内容
            String qrCodeStr = null;

            // 当前生成的是"群聊2维码"，则单独构建2维码内容
            if(QRCodeScheme.isJoinGroupQRCode(schemeFromIntent))
                qrCodeStr = QRCodeScheme.constructJoinGroupCodeStr(idFromIntent, lu() != null? lu().getUser_uid():"");
            // 其它类型就是普通的scheme+id形式构建2维码内容，不需要单独处理了
            else
                qrCodeStr = QRCodeScheme.constructCodeStr(schemeFromIntent, idFromIntent);

            // 生成2维码图片
            Bitmap bitmap = CodeUtils.createQRCode(qrCodeStr, WidgetUtils.dip2px(this, 230.0f), null);
            if (bitmap != null) {
                viewQrcode.setImageBitmap(bitmap);
            }
        } catch (Exception e) {
            Log.w(TAG, e);
        }
    }

    /**
     * 尝试异步加载头像.
     */
    public void loadAvatar() {
        // 当前生成的是"我的2维码"
        if (QRCodeScheme.isAddUserQRCode(schemeFromIntent)) {
            // 本地用户信息
            RosterElementEntity u = lu();
            // 用户头像文件名不为空，表示已设置头像，才需要加载头像啦
            if (u != null && !CommonUtils.isStringEmpty(u.getUserAvatarFileName(), true)) {
                // 显示上方的用户头像
                ImageCacheLoader.loadAvatarImgWithGlide(this, u.getUser_uid(), u.getUserAvatarFileName()
                        , viewAvatar, 35
                        , R.drawable.default_avatar_yuan_70_3x, false, false);
                // 显示2维码中间用作logo的头像
                ImageCacheLoader.loadAvatarImgWithGlide(this, u.getUser_uid(), u.getUserAvatarFileName()
                        , viewAvatarLogo, 7
                        , R.drawable.default_avatar_for_contact_40dp_21pxround, false, false);
            }
        }
        // 当前生成的是"群聊2维码"
        else if(QRCodeScheme.isJoinGroupQRCode(schemeFromIntent)){
            // 加载群头像
            ImageCacheLoader.loadGroupImgWithGlide(Glide.with(this), idFromIntent, viewAvatar, 7 , false, -1);
//          ImageCacheLoader.loadGroupImgWithGlide(Glide.with(this), idFromIntent, viewAvatarLogo, 7 , false);
        }
    }

    /**
     * 显示弹出菜单。
     */
    public void showMenuWindow() {
        //为弹出窗口实现监听类
        final View.OnClickListener itemsOnClick = v -> {
            menuWindow.dismiss();
            switch (v.getId()) {
                // 2维码保存到相册
                case R.id.qrcode_generator_activity_popmenu_dialog_btn_save: {
                    doSaveQrcode();
                    break;
                }
                // 打开"扫一扫"
                case R.id.qrcode_generator_activity_popmenu_dialog_btn_scan: {
                    QRCodeScanActivity.gotoQrCodeScan(self());
                    break;
                }
                default:
                    break;
            }
        };

        // 实例化SelectPicPopupWindow
        menuWindow = new MorePopWindow(this, itemsOnClick);
        // 显示窗口
        menuWindow.showAtLocation(findViewById(R.id.qrcode_generate_activity_MainLL), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0); //设置layout在PopupWindow中显示的位置
    }

    /**
     * 将2维码保存到系统相册。
     */
    private void doSaveQrcode(){
        // 先生成bitmap对象
        Bitmap bmp = WidgetUtils.generateBitmap(layoutContent);
        // bitmap对象生成成功
        if(bmp != null){
            // 保存到相册成功
            if (ToolKits.saveBmp2Gallery(self(), bmp)) {
                WidgetUtils.showToastLong(self(), $$(R.string.qrcode_generate_activity_qr_save_sucess), WidgetUtils.ToastType.OK);
            } else {
                WidgetUtils.showToastLong(self(), $$(R.string.qrcode_generate_activity_qr_save_fail), WidgetUtils.ToastType.WARN);
            }
        }
        else{
            Log.w(TAG, "将2维码保存到相册时失败了，从view生成Bitmap对象失败，生成后的bmp=null!");
            WidgetUtils.showToastLong(self(), $$(R.string.qrcode_generate_activity_qr_generate_fail), WidgetUtils.ToastType.WARN);
        }
    }

    /**
     * 一些回调通知。
     *
     * @param requestCode 请求码
     * @param resultCode 结果码
     * @param data 数据
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == RESULT_OK && data!=null){
            switch (requestCode){
                // 从2维码扫描界面返回的结果回调
                case ActivityRequestCode.REQUEST_CODE_FOR_QRCODE_SCAN:
                    String result = CameraScan.parseScanResult(data);
                    Log.v(TAG, "2维码扫码结果："+result);
                    // 开始解析2维码内容
                    QRCodeScanActivity.processQRCodeScanResult(this, result);
                    break;
            }
        }
    }

    /**
     * 标题栏"更多"按钮对应的弹出窗口式菜单实现类。
     */
    private class MorePopWindow extends ChoiceItemPopWindow {
        private Button btnSave, btnScan, btnCancel;

        public MorePopWindow(Activity context, View.OnClickListener mItemsOnClick) {
            super(context, mItemsOnClick
                    , R.layout.qrcode_generate_activity_popmenu_dialog
                    , R.id.qrcode_generator_activity_popmenu_dialog_pop_layout);
        }

        protected void initContentViewComponents(View mMenuView) {
            btnSave = mMenuView.findViewById(R.id.qrcode_generator_activity_popmenu_dialog_btn_save);
            btnScan = mMenuView.findViewById(R.id.qrcode_generator_activity_popmenu_dialog_btn_scan);
            btnCancel = mMenuView.findViewById(R.id.qrcode_generator_activity_popmenu_dialog_btn_cancel);
            // 取消按钮
            btnCancel.setOnClickListener(createCancelClickListener());
            // 设置按钮监听
            btnSave.setOnClickListener(mItemsOnClick);
            btnScan.setOnClickListener(mItemsOnClick);
        }
    }
}
